package com.example.demo.mapper;

import com.example.demo.model.UserInfo;
import org.apache.catalina.User;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.util.List;

//在我们给接口加上了@Mapper 注解的时候，它就不是一个单纯的接口了。User InfoMapper接口变成了MyBatis 的一部分了
//这个interface, 使用xml就可以实现了▲▲▲▲  而Java的interface是依靠 类来实现的。
//确实，这和传统开发是不一样的!传统开发直接怼业务代码，就行了。现在，是要写SQL了，SQL和业务代码，是两个不同体系。
//所以，可以是xml来保存
//普通接口变成了MyBatis 的接口，有什么好处呢?
//就是将接口的生命周期，交给容器来托管。
//它会实现interface 和xml之间的关联关系。
@Mapper
public interface UserInfoMapper {
    //我们是根据id来获取用户信息嘛，
    //返回值的结果，肯定就是一个userinfo对象嘛!
    //至于方法名称，取的名字，要别人看得懂，知道这个方法是来干什么的。


    // 按id查询信息UserInfo信息
    public UserInfo getUserInfoById(@Param("id") Integer id);
    //public UserInfo findUserInfoById(Integer id);这种命名格式也是可以的。
    //使用的时候，尽量二选一


    // 根据id修改UserInfo名称
    // @Param("name")里的name要和 xml中的一致
    // @RequestParam("xxx")注解是前端和后端联系xxx为前端属性 使用还是后端
    public int updateById(@Param("id") Integer id, @Param("name") String username);



    // 根据id删除UserInfo名称
    public int delById(@Param("id") Integer id);



    // 插入操作 插入指定内容(对象)
    // 返回受影响的行数  这里受影响参数不用指定返回 他自己会返回
    public int add(UserInfo userInfo);//因为插入是对象所以不用@Param("id")



    // 我们不想将影响行数作为返回值了 我们要成功插入用户信息的id
    public int add2(UserInfo userInfo);



    // 了解 #{} &{}
    // 通过时间排序
    public List<UserInfo> orderTime(@Param("order") String order);




    // 多表查询
    // 我们还是通过id来查找 但是有种情况 假设我们创建的UserInfo中的  姓名属性是name  而数据库中的是username
    // 这时我们测试 打印结果 name=null   意思是没有打印出我们期望的值  所以我们该如何解决呢
    // 通过 在xml中 配置resultMap 来解决
    public UserInfo getUserInfoById2(@Param("id") Integer id);




    // 一对多
    // 根据用户id查询用户信息 以及对应的文章信息
    public UserInfo getUserAndArticleById(@Param("id") Integer id);










    // 动态sql使用
    // 如果只有一个非必传参数的情况 可以使用if
    public int add3(UserInfo userInfo);
    // 如果有多个非必传参数呢  就要使用trim + if了
    public int add4(UserInfo userInfo);
    // where 使用
    public UserInfo getUserInfoById3(@Param("id") int id);
    public UserInfo getUserInfoById4(UserInfo userInfo);
    // set 使用
    public int update2(UserInfo userInfo);
    // foreach 使用
    public int delIds(@Param("ids") List<Integer> ids);
}
